                    
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of DetallesComprasData.
	/// </summary>
	public class DetallesComprasData : Singleton<DetallesComprasData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the DetallesCompras table by a foreign key.
		/// </summary>
		public DetallesCompras Obtener(int compraID, int loteID)
		{
			var detallesCompras = default(DetallesCompras);
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesCompras");

			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					detallesCompras = new DetallesCompras
					{
						compraID = lector.IsDBNull(lector.GetOrdinal("compraID"))? default(int) : lector.GetInt32(lector.GetOrdinal("compraID")),
						precioUnitario = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precioUnitario"))),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID"))
					};
				}
			}
			comando.Dispose();
			return detallesCompras;
		}

		/// <summary>
		/// Saves a record to the DetallesCompras table.
		/// </summary>
		public int Agregar(int compraID, DetallesCompras detallesCompras, DbTransaction transaccion)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertDetallesCompras");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "precioUnitario", DbType.Currency, MathExpression.Round(detallesCompras.precioUnitario));
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, detallesCompras.loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
			if (resultado == 0) throw new Exception("Error al Agregar DetallesCompras.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the DetallesCompras table.
		/// </summary>
		public bool Modificar(DetallesCompras detallesCompras)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateDetallesCompras");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, detallesCompras.compraID);
			BaseDatos.AddInParameter(comando, "precioUnitario", DbType.Currency, MathExpression.Round(detallesCompras.precioUnitario));
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, detallesCompras.loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar DetallesCompras.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetallesCompras table by its primary key.
		/// </summary>
		public bool Eliminar(int compraID, int loteID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesCompras");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesCompras.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the DetallesCompras table by a foreign key.
		/// </summary>
		public void EliminarPorCompraID(int compraID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesComprasByCompraID");
			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesCompras.");
			comando.Dispose();
		}

		/// <summary>
		/// Deletes a record from the DetallesCompras table by a foreign key.
		/// </summary>
		public void EliminarPorLoteID(int loteID)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteDetallesComprasByLoteID");
			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar DetallesCompras.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the DetallesCompras table by a foreign key.
		/// </summary>
		public IList<DetallesCompras> ListarPorCompraID(int compraID)
		{
			var entidades = new List<DetallesCompras>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesComprasByCompraID");

			BaseDatos.AddInParameter(comando, "compraID", DbType.Int32, compraID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallesCompras
					{
						compraID = lector.IsDBNull(lector.GetOrdinal("compraID"))? default(int) : lector.GetInt32(lector.GetOrdinal("compraID")),
                        precioUnitario = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precioUnitario"))),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		/// <summary>
		/// Selects all records from the DetallesCompras table by a foreign key.
		/// </summary>
		public IList<DetallesCompras> ListarPorLoteID(int loteID)
		{
			var entidades = new List<DetallesCompras>();
			var comando = BaseDatos.GetStoredProcCommand("SelectDetallesComprasByLoteID");

			BaseDatos.AddInParameter(comando, "loteID", DbType.Int32, loteID);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
					entidades.Add(new DetallesCompras
					{
						compraID = lector.IsDBNull(lector.GetOrdinal("compraID"))? default(int) : lector.GetInt32(lector.GetOrdinal("compraID")),
                        precioUnitario = MathExpression.Round(lector.GetDecimal(lector.GetOrdinal("precioUnitario"))),
						loteID = lector.IsDBNull(lector.GetOrdinal("loteID"))? default(int) : lector.GetInt32(lector.GetOrdinal("loteID"))
					});
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
